//
// Created by Jisam on 30/08/2024 8:49 PM.
// Solution of  P2280 [HNOI2003] 激光炸弹
// 2024-08-30 20:57:33 AC 100
//#pragma GCC optimize(3)
#include <bits/stdc++.h>

using namespace std;
#define endl "\n"
#define PSI pair<string,int>
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define VVI vector<vector<int>>
#define VI vector<int>
#define VS vector<string>
#define PQLI priority_queue<int, vector<int>, less<int>>
#define PQGI priority_queue<int, vector<int>, greater<int>>
#define code_by_jisam ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
typedef long long i64;
typedef unsigned u32;
typedef unsigned long long u64;
typedef __int128 i128;
int dx[] = {-1, 1, 0, 0, 1, 1, -1, -1,};
int dy[] = {0, 0, -1, 1, 1, -1, -1, 1,};

// 定义最大数组大小，用于存储坐标点信息
const int MAXN = 5 * 1e3 +5;
// 定义二维数组a，用于存储坐标点的值
int s[MAXN][MAXN];

/**
 * solution函数：解决特定问题的算法实现
 * 无参数，无返回值
 * 该函数首先读取n和m的值，然后循环读取坐标和值，进行预处理，
 * 计算出某个区域的最大值，并输出结果
 */
void solution() {
    // 读取n和m的值
    int n,m;
    cin >> n >> m;

    // 循环读取每个坐标点及其值，并进行预处理
    for (int i = 1; i <= n; i ++) {
        int x, y, v;
        cin >> x >> y >> v;
        // 对输入的坐标和值进行处理，这里的具体业务逻辑需要根据实际情况确定
        s[x + 1][y + 1] += v;
    }

    // N为坐标范围，这里设定为5001
    int N = 5001;
    // 对二维数组进行累加，计算每个点的前缀和
    for (int i = 1; i <= N; i ++)
        for (int j = 1; j <= N; j ++)
            // 当前点的值等于其左边、上边及左上角的值之和
            s[i][j] +=  s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1];

    // 初始化最大值为0
    int ans = 0;
    // 遍历每个以m*m为尺寸的区域，计算其值的最大值
    for (int i = m; i <= N; i ++)
        for (int j = m; j <= N; j ++) {
            // 计算当前区域的值
            int num = s[i][j] - s[i - m][j] - s[i][j - m] + s[i - m][j - m];
            // 更新最大值
            ans = max(ans, num);
        }

    // 输出最大值
    cout << ans << endl;

}


int main() {
    code_by_jisam;
    int T = 1;
//    cin >> T;
    while (T--) {
        solution();
    }
    return 0;
}